/*
 * 
 * LegendShop 多用户商城系统
 * 
 *  版权所有,并保留所有权利。
 * 
 */
package com.legendshop.oa.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.legendshop.oa.constants.CommonConfigPropertiesEnum;
import com.legendshop.oa.constants.SysParameterEnum;
import com.legendshop.oa.constants.SysParameterTypeEnum;
import com.legendshop.oa.model.SystemParameter;
import com.legendshop.util.AppUtils;
import com.legendshop.util.EnvironmentConfig;
import com.legendshop.util.SystemUtil;

/**
 * 
 * 获取系统的配置 包括数据库和配置文件的配置
 */
public class PropertiesUtil extends SystemUtil {

	/** 从数据库中获取的对象. */
	private static Map<String, Object> commonObject = new HashMap<String, Object>();

	/**
	 * 设置数据对象.
	 * 
	 * @param sysParameterEnum
	 *            the parameter enum
	 * @param obj
	 *            the obj
	 */
	public static void setObject(SysParameterEnum sysParameterEnum, Object obj) {
		if (obj.getClass() != sysParameterEnum.getClazz()) {
			throw new RuntimeException("Required Type = " + sysParameterEnum.getClazz() + ", but Actual Type = " + obj.getClass());
		}
		commonObject.put(sysParameterEnum.name(), obj);
	}

	/**
	 * 设置系统.
	 * 
	 * @param parameter
	 *            the parameter
	 * @param propertiesUpdater
	 *            the properties updater
	 */
	public static void setParameter(SystemParameter parameter) {
		String type = parameter.getType();
		if (SysParameterTypeEnum.Integer.name().equalsIgnoreCase(type)) {
			try {
				commonObject.put(parameter.getName(), Integer.valueOf(parameter.getValue()));
			} catch (Exception e) {
				commonObject.put(parameter.getName(), Integer.valueOf(parameter.getOptional()));
			}

		} else if (SysParameterTypeEnum.Boolean.name().equalsIgnoreCase(type)) {
			commonObject.put(parameter.getName(), Boolean.valueOf(parameter.getValue()));
		} else if (SysParameterTypeEnum.Double.name().equalsIgnoreCase(type)) {
			try {
				commonObject.put(parameter.getName(), Double.valueOf(parameter.getValue()));
			} catch (Exception e) {
				commonObject.put(parameter.getName(), Double.valueOf(parameter.getOptional()));
			}
		} else if (SysParameterTypeEnum.Long.name().equalsIgnoreCase(type)) {
			try {
				commonObject.put(parameter.getName(), Long.valueOf(parameter.getValue()));
			} catch (Exception e) {
				commonObject.put(parameter.getName(), Long.valueOf(parameter.getOptional()));
			}

		} else if (SysParameterTypeEnum.List.name().equalsIgnoreCase(type)) {
			// 以英文逗号分隔
			List<String> list = new ArrayList<String>();
			if (AppUtils.isNotBlank(parameter.getValue())) {
				String[] values = parameter.getValue().split(",");
				for (String str : values) {
					list.add(str);
				}
			}
			commonObject.put(parameter.getName(), list);
		} else {// String default and Selection and password
			commonObject.put(parameter.getName(), parameter.getValue());
		}
	}

	/**
	 * 获取数据库的通用配置
	 * 
	 * @param <T>
	 *            the generic type
	 * @param sysParameterEnum
	 *            the parameter enum
	 * @param clazz
	 *            the clazz
	 * @return the object
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getObject(SysParameterEnum sysParameterEnum, Class<T> clazz) {
		// if (clazz != sysParameterEnum.getClazz()) {
		// throw new RuntimeException("Required Type = " +
		// sysParameterEnum.getClazz() + ", but Actual Type = "
		// + clazz);
		// }
		return (T) commonObject.get(sysParameterEnum.name());
	}

	/**
	 * Gets the boolean object.
	 * 
	 * @param parameterEnum
	 *            the parameter enum
	 * @return the boolean object
	 */
	public static Boolean getBooleanObject(String parameter) {
		return (Boolean) commonObject.get(parameter);
	}

	/**
	 * Send mail.
	 * 
	 * @return true, if successful
	 */
	public static boolean sendMail() {
		return PropertiesUtil.getObject(SysParameterEnum.SEND_MAIL, Boolean.class);
	}

	// //////////////////////////////////////////////////////////////////////////
	// 以下是配置文件的配置
	// /////////////////////////////////////////////////////////////////////////////////////

	/**
	 * 读取PC端域名配置
	 * 
	 */
	public static String getPcDomainName() {
		return EnvironmentConfig.getInstance().getPropertyValue(CommonConfigPropertiesEnum.PC_DOMAIN_NAME);
	}


	/**
	 * 读取手机端域名配置
	 * 
	 */
	public static String getMobileDomainName() {
		return EnvironmentConfig.getInstance().getPropertyValue(CommonConfigPropertiesEnum.MOBILE_DOMAIN_NAME);
	}
	
	/**
	 * Checks if is system in debug mode.
	 * 
	 * @return true, if is system in debug mode
	 */
	public static boolean isSystemInDebugMode() {
		return "true".equals(EnvironmentConfig.getInstance().getPropertyValue(CommonConfigPropertiesEnum.SQL_DEBUG_MODE));
	}	

}
